package _03_recursion;


import org.junit.Test;

import java.util.LinkedList;

/**
 * @author: mornd
 * @dateTime: 2023/6/1 - 19:24
 * 模拟汉诺塔
 */
public class HanoiTest {
    LinkedList<Integer> a = new LinkedList<>();
    LinkedList<Integer> b = new LinkedList<>();
    LinkedList<Integer> c = new LinkedList<>();

    @Test
    public void test() {
        // 圆盘数
        int count = 4;
        init(count);
        print();

        move(count, a, b, c);
    }

    /**
     * 移动方法
     *
     * @param n 需要移动圆盘的个数
     * @param a 源圆盘
     * @param b 借位圆盘
     * @param c 目标圆盘
     */
    void move(int n, LinkedList<Integer> a, LinkedList<Integer> b, LinkedList<Integer> c) {
        if (n == 0) {
            return;
        }
        move(n - 1, a, c, b); // 把 n-1 个圆盘由 a 借 b 移动到 c
        c.addLast(a.removeLast());
        print();
        move(n - 1, b, a, c);// 把 n-1 个圆盘由 b 借 a 移动到 c
    }

    private void print() {
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-------");
    }

    private void init(int c) {
        for (int i = 1; i <= c; i++) {
            a.addFirst(i);
        }
    }
}
